﻿#ifndef GY_CONTROLTABLEVIEW_H
#define GY_CONTROLTABLEVIEW_H
#include "GY_IdTableView.h"
#include "ItemView_BeiJing/GY_WidgetReflect.h"

/**
 * @brief The GY_ControlTableView class
 * 支持注册控件到列的表格
 */
class GY_CONTROLLIBRARY_EXPORT GY_ControlTableView : public GY_IdTableView
{
    Q_OBJECT
public:
    explicit GY_ControlTableView(QWidget *parent = nullptr);
    ~GY_ControlTableView();
signals:
    /**
     * @brief clickedCustomWidget 注册控件被点击事件
     * @param id 被点击的行
     * @param columenIndex 被点击的列
     * @param data 控件传出数据
     * @param index 被点击modol的index
     */
    void clickedCustomWidget(const QVariant &id,const qint32 columenIndex,const QVariant &data , const QModelIndex &index = QModelIndex());
public:
//-----------------------------列编辑接口---------------------------//
    /**
    * @brief setColumnCount 设置列数
    * @param columnCount 添加的列数
    */
    void setColumnCount(const int columnCount);
    /**
    * @brief addColumn 添加空白列
    * @param columnName 添加的列名
    */
    void addColumn(const QString &columnNmae);
    /**
    * @brief insterColumn 插入列
    * @param index 插入在第几列
    * @param columnName 插入的列名
    * @return 返回插入列是否成功
    */
    bool insterColumn(const int index, const QString &columnName);
    /**
    * @brief deleteColumn 删除列
    * @param index 删除的第几列
    * @return 返回删除列是否成功
    */
    bool deleteColumn(const int index);
    /**
    * @brief registerControl 注册自定义控件
    * @param columnName 注册自定义控件列号
     */
    template<typename T>
    bool registerControl(qint32 columnIndex);
    /**
    * @brief addColumnAndRegisterControl 添加空白列并且为列注册控件
    * @param columnName 注册控件的名称
     */
    template<typename T>
    void addColumnAndRegisterControl(const QString &columnName);
    /**
    * @brief insertColumnAndRegisterControl 插入空白列并且为列注册控件
    * @param columnName 注册控件的名称
     */
    template<typename T>
    void insertColumnAndRegisterControl(int index,const QString &columnName);
//-----------------------------行编辑接口---------------------------//
    /**
    * @brief addRowData 添加行
    * @param rowId 行Id
    * @param rowData 行数据
    * @return返回是否添加成功
    */
    virtual bool addRowData(const QVariant& rowId, const QVector<QVariant> &rowData);
    /**
     * @brief insertRowData 插入行数据
     * @param rowIndex 插入行索引
     * @param rowId 插入的行Id
     * @param rowData 插入的行数据
     * @return 是否插入成功
     */
    bool insertRowData(const int rowIndex,const QVariant& rowId, const QVector<QVariant> &rowData);
    /**
     * @brief deleteRow  删除指定行
     * @param rowId 删除行Id
     * @return 返回删除是否成功
     */
    bool deleteRow(const QVariant& rowId);
    /**
     * @brief setRowData  修改行数据
     * @param rowId 行Id
     * @param rowData  待修改的数据
     * @return 是否修改成功
     */
    bool setRowData(const QVariant& rowId, const QVector<QVariant>&rowData);
    /**
     * @brief getRowData 获取行数据
     * @param rowId 行ID
     * @return 返回获取的行数据
     */
    QVector<QVariant> getRowData(const QVariant& rowId);
    //-----------------------------行编辑接口---------------------------//
    /**
     * @brief setCellData  修改单元格数据
     * @param rowId 修改行Id
     * @param columnIndex  修改列索引
     * @param cellData  要修改的数据
     * @param role 修改的数据类型
     * @return 是否修改成功
     */
    bool setCellData(const QVariant& rowId, const int columnIndex, const QVariant &cellData, int role=TableDataType::TransferData);
    /**
     * @brief setCellText 设置单元格文字
     * @param rowId 行ID
     * @param columnIndex 列索引
     * @param displayText 显示文字
     * @return 是否设置成功
     */
    bool setCellText(const QVariant& rowId, const int columnIndex,const QString& displayText);
    /**
     * @brief getCellData
     * @param rowId 行ID
     * @param columnIndex 列索引
     * @param role 获取的数据类型
     * @return 单元格数据
     */
    QVariant getCellData(const QVariant& rowId, const int columnIndex,int role=TableDataType::TransferData);
    /**
     * @brief getCellText 获取单元格文字
     * @param rowId 行ID
     * @param columnIndex 列索引
     * @return 单元格文字
     */
    QString getCellText(const QVariant& rowId, const int columnIndex);

    /**
     * @brief getRowCount 获取表格行数
     */
    int getRowCount();

private:
    //!注册控件信息
    QMap<qint32,QString> m_RegisterInfo;
    //!存放注册类型构造函数
    QHash<QString,WidgetReflect::Constructor> m_RegisterHash;
    //!表格model
    QStandardItemModel* m_pViewModel;
    //!列数
    int m_ColumnNumber = 0;
};

template<typename T>
bool GY_ControlTableView::registerControl(qint32 columnIndex)
{
    WidgetReflect::Constructor pFun= WidgetReflect::registerClass<T>();
    if(m_RegisterInfo.contains(columnIndex))
    {
        m_RegisterInfo.remove(columnIndex);
    }
    QString className = QString(T::staticMetaObject.className());
    m_RegisterInfo.insert(columnIndex, className);
    m_RegisterHash.insert(className,pFun);
    return true;
}

template<typename T>
void GY_ControlTableView::addColumnAndRegisterControl(const QString &name)
{
    registerControl<T>(m_ColumnNumber);
    addColumn(name);
}
template<typename T>
void GY_ControlTableView::insertColumnAndRegisterControl(int index,const QString &name)
{
    if(index > m_ColumnNumber || index < 0){
        return;
    }
    insterColumn(index,name);
    registerControl<T>(index);
}
#endif // GY_CONTROLTABLEVIEW_H
